package com.wangrui.test;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
/** 
* TableRenderDemo is just like TableDemo, except that it
* explicitly initializes column sizes and it uses a combo box
* as an editor for the Sport column.
*/
public class TableRenderDemo extends JPanel {
    private boolean DEBUG = true;
    public TableRenderDemo(){
    super(new GridLayout(1,0));
    JTable table = new JTable(new MyTableModel());
    table.setPreferredScrollableViewportSize(new Dimension(500,70));
   //Create the scroll pane and add the table to it.
    JScrollPane scrollPane = new JScrollPane(table);
    //Set up column sizes
    initColumnSizes(table); 
        //Fiddle with the Sport column's cell editors/renderers.
    setUpSportColumn(table,table.getColumnModel().getColumn(1));
    //Add the scroll pane to this panel
    add(scrollPane);
    }
   /*
     * This method picks good column sizes.
     * If all column heads are wider than the column's cells'
     * contents, then you can just use column.sizeWidthToFit().
     */
    private void initColumnSizes(JTable table){
    MyTableModel model = (MyTableModel)table.getModel();
    TableColumn column = null;
    Component comp = null;
    int headerWidth = 0;
    int cellWidth = 0;
    Object [] longValues = model.longValues;
    TableCellRenderer headerRenderer =
       table.getTableHeader().getDefaultRenderer();
    for(int i = 0;i < table.getColumnCount();i++){
       column = table.getColumnModel().getColumn(i);
       comp = headerRenderer.getTableCellRendererComponent(
              null, column.getHeaderValue(),
              false, false, 0, 0);
       headerWidth = comp.getPreferredSize().width;
       comp = table.getDefaultRenderer(
           model.getColumnClass(i)).getTableCellRendererComponent(
           table, longValues[i], 
           false, false, 0, i);
       cellWidth = comp.getPreferredSize().width;
            if(DEBUG){
            System.out.println("Initializing width of column "
                   + i +"."
                   +"headerWidth = "+headerWidth
                   +"cellWidth = "+cellWidth);
            }
            column.setPreferredWidth(Math.max(headerWidth, cellWidth));
        }
    }
    public void setUpSportColumn(JTable table,
            TableColumn sportColumn){
    
    JComboBox comboBox = new JComboBox();
    comboBox.addItem("java");
    comboBox.addItem(".NET");
    comboBox.addItem("C++");
    comboBox.addItem("JSP");
    comboBox.addItem("PHP");
    sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

        //Set up tool tips for the sport cells.
    DefaultTableCellRenderer renderer = 
        new DefaultTableCellRenderer();
        renderer.setToolTipText("Click for combo box");
        sportColumn.setCellRenderer(renderer);
    }
    class MyTableModel extends AbstractTableModel {
        private String[] columnNames = {"姓名",
                                        "专业",
                                        "工龄",
                                        "健在"};
        private Object[][] data = {
           {"吕振","java",new Integer(3),new Boolean(true)},
     {"张沛",".NET",new Integer(4),new Boolean(true)},
     {"岳飞","weapon",new Integer(100),new Boolean(false)},
       {"张艺谋","film",new Integer(50),new Boolean(true)}
        };
        public final Object[] longValues = {"吕振","None of the above",
                  new Integer(29),Boolean.TRUE};
        public int getColumnCount() {
            return columnNames.length;
        }
        public int getRowCount() {
            return data.length;
        }
        public String getColumnName(int col) {
            return columnNames[col];
        }
        public Object getValueAt(int row, int col) {
            return data[row][col];
        }
       /*
         * JTable uses this method to determine the default renderer/
         * editor for each cell. If we didn't implement this method,
         * then the last column would contain text ("true"/"false"),
         * rather than a check box.
         */
        public Class getColumnClass(int c) {
        //实现了如果是boolean自动转成JCheckbox
        /*需要自己的celleditor这么麻烦吧。jtable自动支持Jcheckbox，
        * 只要覆盖tablemodel的getColumnClass返回一个boolean的class，
        * jtable会自动画一个Jcheckbox给你，
        * 你的value是true还是false直接读table里那个cell的值就可以*/
        System.out.println("=============="+getValueAt(0, c).getClass());
            return getValueAt(0, c).getClass();
        }
       /*
         * Don't need to implement this method unless your table's
         * editable.
         */
        public boolean isCellEditable(int row, int col) {
            //Note that the data/cell address is constant,
            //no matter where the cell appears onscreen.
            if (col < 2) {
                return false;
            } else {
                return true;
            }
        }
        /*
         * Don't need to implement this method unless your table's
         * data can change.
         */
        public void setValueAt(Object value, int row, int col) {
            if (DEBUG) {
                System.out.println("Setting value at " + row + "," + col
                                   + " to " + value
                                   + " (an instance of "
                                   + value.getClass() + ")");
            }
            data[row][col] = value;
            fireTableCellUpdated(row, col);
            if (DEBUG) {
                System.out.println("New value of data:");
                printDebugData();
            }
        }
        private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();
            for (int i=0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j=0; j < numCols; j++) {
                    System.out.print(" " + data[i][j]);
                }
                System.out.println();
            }
            System.out.println("--------------------------");
        }
    }
   /**
     * Create the GUI and show it. For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
       //Create and set up the window.
        JFrame frame = new JFrame("TableRenderDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       //Create and set up the content pane.
        TableRenderDemo newContentPane = new TableRenderDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);
       //Display the window.
        frame.pack();
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}